//树的表示
typedef int Datatype;
struct Node
{
    struct Node* FirstChild;    //第一个孩子节点
    struct Node* NextBrother;   //指向其下一个兄弟节点
    Datatype data;              //节点中的数据域
};

/*
二叉树一般可以使用两种结构存储，一种顺序结构，一种链式结构。
1. 顺序存储
顺序结构存储就是使用数组来存储，一般使用数组只适合表示完全二叉树，因为不是完全二叉树会有空
间的浪费。而现实中使用中只有堆才会使用数组来存储，关于堆我们后面的章节会专门讲解。二叉树顺
序存储在物理上是一个数组，在逻辑上是一颗二叉树。
2. 链式存储
二叉树的链式存储结构是指，用链表来表示一棵二叉树，即用链来指示元素的逻辑关系。 通常的方法是
链表中每个结点由三个域组成，数据域和左右指针域，左右指针分别用来给出该结点左孩子和右孩子所
在的链结点的存储地址 。链式结构又分为二叉链和三叉链
*/
typedef int BTDataType;
struct BinaryTreeNode
{
    struct BinaryTreeNode* pleft;  //指向当前节点左孩子
    struct BinaryTreeNdoe* pright; //指向当前节点右孩子
    BTDataType data;               //存放数据
};

/*
普通的二叉树是不适合用数组来存储的，因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结
构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储
堆的性质：
堆中某个节点的值总是不大于或不小于其父节点的值；
堆总是一棵完全二叉树。
*/

/*把无序的几个数调整成堆的结构进行储存，需要排序，即函数AdjustUp的操作 向上调整的前提是前面是堆*/
/*AdjuctDown是从上向下调整，条件是两个子树是堆*/